package com.yingdong.db;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.yingdong.gateserver.innter.service.ConfigService;

public class DBUtils {
//	static Log logger = LogFactory.getLog(DBUtils.class);
//	public static <T> T selectDomainById(Class<T> t, int id) throws Exception {
//		String name = t.getSimpleName();
//		String sql = "SELECT * FROM ";
//		sql += name;
//		sql += " WHERE id=?";
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			st.setInt(1, id);
//			rs = st.executeQuery();
//			List<T> result = praseResultToList(t, rs);
//			if (result.size() == 0)
//				return null;
//			return result.get(0);
//		} catch (Exception e) {
//			logger.error("",e);
//
//			return null;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static <T> int selectMaxId(Class<T> t) throws Exception {
//		String name = t.getSimpleName();
//		String sql = "SELECT max(id) FROM ";
//		sql += name;
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//			if (rs.next())
//				return rs.getInt(1);
//			else
//				return -1;
//		} catch (Exception e) {
//			logger.error("",e);
//			return -1;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//	}
//
//	public static <T> T selectOnlyDomain(Class<T> t, String sql) throws Exception {
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//			List<T> result = praseResultToList(t, rs);
//			if (result.size() == 0)
//				return null;
//			return result.get(0);
//		} catch (Exception e) {
//			logger.error("",e);
//
//			return null;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static <T> List<T> selectDomains(Class<T> t) throws Exception {
//		String name = t.getSimpleName();
//		String sql = "SELECT * FROM ";
//		sql += name;
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//			List<T> result = praseResultToList(t, rs);
//
//			return result;
//		} catch (Exception e) {
//			logger.error("",e);
//
//			return null;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static Object selectOnlyResultBySql(String sql) throws Exception {
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//			if (rs.next())
//				return rs.getObject(1);
//			else
//				return -1;
//		} catch (Exception e) {
//			logger.error("",e);
//			return -1;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//	}
//
//	public static <T> List<T> selectDomainsInSql(Class<T> t, String sql) throws Exception {
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//			List<T> result = praseResultToList(t, rs);
//
//			return result;
//		} catch (Exception e) {
//			logger.error("",e);
//
//			return null;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static <T> void updateDimainById(T t) throws Exception {
//		Method mds = t.getClass().getMethod("getId");
//
//		Object id = mds.invoke(t);
//		if (id == null) {
//			return;
//		}
//		Class<?> c = t.getClass();
//		String tableName = c.getSimpleName();
//		String sql = "UPDATE " + tableName;
//		sql += " SET ";
//		Method[] mlist = t.getClass().getMethods();
//		for (int i = 0; i < mlist.length; i++) {
//			Method method = mlist[i];
//			String mname = method.getName();
//			if (!mname.equals("getClass") && mname.startsWith("get") && !mname.toLowerCase().equals("getid")) {
//				Object v = method.invoke(t);
//				if (v != null) {
//					sql += mname.replace("get", "").toLowerCase() + "=?,";
//				}
//			}
//		}
//		sql = sql.substring(0, sql.length() - 1);
//		sql += " WHERE id=?";
//		PreparedStatement st = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			int j = 0;
//			for (int i = 0; i < mlist.length; i++) {
//				Method method = mlist[i];
//				String mname = method.getName();
//				if (!mname.equals("getClass") && mname.startsWith("get") && !mname.toLowerCase().equals("getid")) {
//					Object v = method.invoke(t);
//					if (v != null) {
//						st.setObject(++j, v);
//					}
//
//				}
//			}
//			st.setObject(++j, id);
//			st.executeUpdate();
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static void updateSql(String sql) throws Exception {
//		PreparedStatement st = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			st.executeUpdate();
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static Method hasMethod(Class t, String name) {
//		try {
//			Method mdg = t.getClass().getMethod(name);
//			if (mdg != null) {
//				return mdg;
//			}
//		} catch (NoSuchMethodException e) {
//			return null;
//		}
//		return null;
//	}
//
//	public static <T> int insertDomain(T t) throws Exception {
//		Class<?> c = t.getClass();
//		String tableName = c.getSimpleName();
//		String sql = "INSERT INTO " + tableName;
//		sql += " (";
//		String sql1 = "VALUES(";
//		Method[] mlist = t.getClass().getMethods();
//		ResultSet rs = null;
//		for (int i = 0; i < mlist.length; i++) {
//			Method method = mlist[i];
//			String mname = method.getName();
//			String cn = mname.replace("get", "").toLowerCase();
//			if (!mname.equals("getClass") && mname.startsWith("get")) {
//				Object v = method.invoke(t);
//				if (v != null) {
//					sql += "`" + cn + "`,";
//					sql1 += "?,";
//				}
//			}
//		}
//		sql = sql.substring(0, sql.length() - 1);
//		sql1 = sql1.substring(0, sql1.length() - 1);
//		sql += ")";
//		sql1 += ")";
//		sql += sql1;
//		PreparedStatement st = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
//			int j = 0;
//			for (int i = 0; i < mlist.length; i++) {
//				Method method = mlist[i];
//				String mname = method.getName();
//				if (!mname.equals("getClass") && mname.startsWith("get")) {
//					Object v = method.invoke(t);
//					if (v != null) {
//						st.setObject(++j, v);
//
//					}
//				}
//			}
//			st.executeUpdate();
//			int index = 0;
//			rs = st.getGeneratedKeys();
//			if (rs.next()) {
//				index = rs.getInt(1);
//			}
//
//			Method mds = hasMethod(t.getClass(), "getId");
//			Method mdg = hasMethod(t.getClass(), "setId");
//
//			if (mds != null && mdg != null) {
//				mdg.invoke(t, index);
//			}
//			return index;
//		} catch (Exception e) {
//			logger.error("",e);
//			return 0;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//	}
//
//	public static <T> void deleteDomainById(T t) throws Exception {
//		Class<?> c = t.getClass();
//		String tableName = c.getSimpleName();
//		String sql = "DELETE FROM " + tableName;
//		sql += " WHERE id=?";
//		Method method = t.getClass().getMethod("getId");
//		PreparedStatement st = null;
//		if (method != null) {
//			Object object = method.invoke(t);
//			if (object == null) {
//				return;
//			}
//			try {
//				Connection connection = DBManager.getConnection();
//				st = connection.prepareStatement(sql);
//				st.setObject(1, object);
//				st.executeUpdate();
//			} catch (Exception e) {
//				logger.error("",e);
//			} finally {
//				st.close();
//				DBManager.closeConnection();
//			}
//		}
//	}
//	
//	public static void deleteInSql(String sql) throws Exception {
//		PreparedStatement st = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			st.executeUpdate();
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			st.close();
//			DBManager.closeConnection();
//		}
//	}
//
//	/** 批量删除 */
//	public static void deleteBatch(Class<?> c, List<Long> idList) throws Exception {
//		String tableName = c.getSimpleName();
//		String sql = "DELETE FROM " + tableName + " WHERE id=?";
//		PreparedStatement st = null;
//
//		try {
//			Connection connection = DBManager.getConnection();
//			connection.setAutoCommit(false);
//			st = connection.prepareStatement(sql);
//
//			for (int i = 0; i < idList.size(); ++i) {
//				st.setLong(1, idList.get(i));
//				st.addBatch();
//			}
//			st.executeBatch();
//			connection.commit();
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			st.close();
//			DBManager.closeConnection();
//		}
//	}
//
//	public static <T> List<T> selectDomainsByConditions(Class<T> t, Map cons) throws Exception {
//		if (cons == null || cons.size() == 0)
//			return selectDomains(t);
//
//		String name = t.getSimpleName();
//		String sql = "SELECT * FROM ";
//		sql += name;
//		sql += " WHERE ";
//		List<Object> l = new ArrayList<Object>();
//		for (Object key : cons.keySet()) {
//			Object value = cons.get(key);
//			if (value != null) {
//				sql += key.toString() + "=? AND ";
//				l.add(value);
//			}
//		}
//		sql += "1=1 ";
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			for (int i = 0; i < l.size(); i++) {
//				Object value = l.get(i);
//				st.setObject(i + 1, value);
//			}
//			rs = st.executeQuery();
//			List<T> result = praseResultToList(t, rs);
//
//			return result;
//		} catch (Exception e) {
//			logger.error("",e);
//
//			return null;
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//
//	}
//
//	public static <T> List<T> praseResultToList(Class<T> t, ResultSet rs) throws Exception {
//		List<T> list = new ArrayList<T>();
//
//		ResultSetMetaData metadata = rs.getMetaData();
//		int count = metadata.getColumnCount();
//		while (rs.next()) {
//			T result = t.newInstance();
//			for (int i = 0; i < count; i++) {
//				Object valueObject = rs.getObject(i + 1);
//				String columName = metadata.getColumnName(i + 1);
//				setter(result, columName, valueObject, valueObject.getClass());
//			}
//			list.add(result);
//		}
//		return list;
//	}
//
//	public static <T> void setter(T obj, String att, Object value, Class<?> ty) {
//		try {
//			Method met = obj.getClass().getDeclaredMethod("set" + initStr(att), ty);
//			met.invoke(obj, value);
//		} catch (Exception e) {
//			logger.error("",e);
//		}
//	}
//
//	public static <T> Object getter(T obj, String att, Class<?> ty) {
//		try {
//			Method met = obj.getClass().getDeclaredMethod("get" + initStr(att), ty);
//			Object resultObject = met.invoke(obj);
//			return resultObject;
//		} catch (Exception e) {
//			logger.error("",e);
//			return null;
//		}
//	}
//	
//	public static Map<String, Integer> getIdConditions(String field, int value) {
//		Map<String, Integer> cons = new HashMap<String, Integer>();
//		cons.put(field, value);
//		return cons;
//	}
//
//	private static String initStr(String old) {
//		String str = old.substring(0, 1).toUpperCase() + old.substring(1).toLowerCase();
//		return str;
//	}
//
//	public static void clearDB() throws Exception {
//		String sql = "SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) " + "FROM information_schema.tables " + "where TABLE_SCHEMA = 'knight'";
//		PreparedStatement st = null;
//		ResultSet rs = null;
//		List<String> list = null;
//		try {
//			Connection connection = DBManager.getConnection();
//			st = connection.prepareStatement(sql);
//			rs = st.executeQuery();
//
//			ResultSetMetaData metadata = rs.getMetaData();
//			int count = metadata.getColumnCount();
//			list = new ArrayList<String>(count);
//
//			while (rs.next()) {
//				String cmd = rs.getString(1);
//				list.add(cmd);
//			}
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			if (rs != null)
//				rs.close();
//			if (st != null)
//				st.close();
//			DBManager.closeConnection();
//		}
//		executeBatch(list);
//	}
//
//	/** 批量执行sql语句 */
//	public static void executeBatch(List<String> tableList) throws Exception {
//		Statement sm = null;
//
//		try {
//			Connection connection = DBManager.getConnection();
//			connection.setAutoCommit(false);
//			sm = connection.createStatement();
//
//			for (String sql : tableList) {
//				
//				sm.addBatch(sql);
//			}
//
//			sm.executeBatch();
//			connection.commit();
//			
//		} catch (Exception e) {
//			logger.error("",e);
//		} finally {
//			sm.close();
//			sm = null;
//			DBManager.closeConnection();
//		}
//	}
//
//	public static void main(String[] args) {
//		try {
//			// rename();
//			// DBManager.init();
//			// for (int i = 0; i < 100; i++) {
//			// Thread thread = new Thread(new Runnable() {
//			//
//			// @Override
//			// public void run() {
//			// while (true) {
//			//
//			// try {
//			// // rewardExt = selectDomainById(TestTable.class,
//			// // 100);
//			// // rewardExt.setName("dfgdfgdfgdgdg");
//			// // deleteDomainById(rewardExt);
//			// Map paramMap = new HashMap();
//			// paramMap.put("name", "a842588a-5d2b-4961-a363-8f5bae23db51");
//			// paramMap.put("type", 1);
//			//
//			// } catch (Exception e1) {
//			// // TODO Auto-generated catch block
//			// e1.printStackTrace();
//			// }
//			//
//			// }
//			// }
//			// });
//			// thread.start();
//			// }
//			 DBUtils.clearDB();
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			logger.error("",e);
//		}
	//}

}
